wait group 通常用來等待一組 goroutine 完成工作。
wait group 維護了一個 counter,並且依據 counter 的數字來控制 goroutine。透過三個操作來控制
Add(delta int)
: 將 counter 加 delta。如果 counter 變為 0,被 Wait() 所擋住的 goroutine 將會放行。Done()
: 將 conter 減 1,其實它的實作就是 Add(-1)。Wait()
: 一直等待,直到 counter 變為 0。以下給一個程式的例子,定義一個 worker,並且讓五個 worker 做事,五個 worker 做完事情後,counter 一定為 0,這時正在 wait 的 main goroutine 才會繼續執行。
func worker(id int) {
fmt.Printf("Worker %d starting\n", id)
time.Sleep(time.Second)
fmt.Printf("Worker %d done\n", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
i := i
go func() {
defer wg.Done()
worker(i)
}()
}
wg.Wait()
}
在 go 裏很常使用到錯誤處理,但是 wait group 本身並沒有支援錯誤處理流程,自己設計錯誤處理又很容易犯錯。errgroup package 就可以解決這個問題。而且 errgroup 同時支援 context 的做法,下一次就來寫 errgroup 吧